热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中属性和target属性分析

1.概要<uses-sdk>用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本。通过在manifest清单文件中添加该属性,
1. 概要 

 

 用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本。通过在manifest清单文件中添加该属性,我们可以更好的控制应用在不同android 系统版本上的安装和兼容性体验问题。

                                                                                   

       (图 1)

    如上图所示,通过minSdkVersion,targetSdkVersion,maxSdkVersion三个属性对应用安装兼容性方面进行控制。下面我们依次对这三个属性进行详细介绍。

 
  2. minSdkVersion
 

该属性的作用主要体现在两个阶段,一个是在应用安装时,一个是在项目构建时。

 

     2.1. 安装时作用

               当安装应用的手机系统API level 小于 minSdkVersion的值时,将不能安装该应用。 

       minSdkVersion 用于指明应用程序运行所需的最小API level。如果不指明该属性,其默认值为1。如上图1中minSdkVersion =“8”,说明该应用在只能安装在大于等于android系统API level 为8(android2.2)的系统上。如果将该应用安装在API level 小于8的android系统上,系统会提示手机API level的版本太低,安装失败。 

所以这里有一点需要引起我们注意,我们在开发时必须留意我们用到API 接口的版本。在定义minSdkVersion属性时,尽量要让minSdkVersion的值大于等于我们用到的API 接口的开始被支持的最低版本。这样可以让不支持该接口的android系统不能安装我们的应用,防止应用在一些手机上因兼容性问题而崩溃。

 

      2.2.构建项目时作用

 

       在程序中如果我们用到了高于minSdkVersion的值的API接口,Eclipse会自动报错提醒开发者。这里我们以getActionBar()这个接口为例,这个接口是在android 3.0(API leve 11)中出现的。我们通过设置minSdkVersion的值来查看程序中开发工具(Eclipse)对程序的检测。

 

 

  • 如下图minSdkVersion = 8时,我们调用API level 为13的接口时Eclipse会自动报错提示开发者:

 

 
 
 
 

这里我们可以通过Eclipse 的修复提示选择Add@SuppressLIne “NewApi” 来对付编译错误,但是并不建议这样解决问题。这样虽然躲过了编译报错,能成功编译出apk文件,但是如果在低于android 3.0(API leve 13)系统的手机上安装该应用后运行可能就会出现程序崩溃现象(高于android 3.0(API leve 13)系统的手机上安装运行正常)。对于一个app来说与其在手机上出现崩溃,不如不让用户安装这个应用(个人观点),当然这里需要综合考虑新api的调用频率和场景进行综合判段。

这里采用Eclipse 的@SuppressLint(“NewApi”)方法防止报错提示。

                                 

 


在android 2.3(API level 9)系统上安装后运行时,应用出现崩溃现象。

 

 

 

  • 这时我们可以考虑能用修改minSdkVersion的值来解决该问题,我们将minSdkVersion的值设置为11。
 
 
 
 

 一切正常没有报错。这时在android系统版本小于android 3.0(API level 11) 时安装该应用时将不能安装;在android系统3.0以上正常安装运行。

 

2.3. 总结

从上面两点中我们已经看到了minSdkVersion的重要性。minSdkVersion不仅在程序安装时起作用,也会在项目构建时起作用。我们应该充分利用它的这两个作用,谨慎的设置其值,保证应用不会因为接口兼容问题在一些手机上运行时崩溃影响用户体验。

 

3. maxSdkVersion

      标明可以运行你的应用的最高API Level版本。现在Google官方文档中已经建议不推荐使用这个属性了。

在android 1.5,1.6,2.0和2. 0. 1系统上安装应用或系统升级时,系统会检查这个值。在这两种情况下,如果应用设置的maxSdkVersion 值低于系统本身使用的API Level,系统将不会允许安装该应用;在系统升级后,新系统会重新校验这个值,如果新系统的API Level高于这个值,新系统会删除你的应用。在android 2. 0. 1(API level 6)系统后该属性作用已经失效,也建议不在使用该属性。

例如:

 

 

在android 2.3(API level  9)上安装该应用时,从下图可以看出maxSdkVersion 已经没有效果了,当系统API level大于maxSdkVersion也照样能安装该应用。

 

新版本系统基本上是完全兼容以前的老版本的,没有必要设置这个属性去阻止你的应用在新版本上安装;另外,如果你指定了这个属性,用户手机系统升级可能会删掉你的应用。所以这个属性完全没有必要设置的了,这可能也是Google推荐不再使用的原因吧。

 

4. targetSdkVersion

 

 

这个属性会告诉系统该应用已经在API level 为targetSdkVersion值的系统上进行了充分测试,如果系统的API level 和当前应用的targetSdkVersion一样,系统将不会启用兼容模式运行该应用,如果不设置其默认值将等于minSdkVersion的值。

如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续你期望的形式来运行。例如,设置这个targetSdkVersion值为11或更高,当你的应用运行在Android3.0或更高的系统上时,系统会自动为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level11就暗示了支持大屏幕。一般情况下,应该将这个属性的值设置为最新的API level 值,这样的话就可以充分利用新版本系统上的新特性。Eclipse在生成项目时,默认将该值设置为最高。

 

Android版本更新时添加新特性详见:

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html

如果平台的API Level低于你的应用程序中的targetSdkVersion属性指定的值时, 系统会开启兼容行为来确保你的应用程序能正常运行,这时一些在targetSdkVersion上的特性就没有了。但是,这个设置仅仅是一个声明、一个通知,在低版本系统中运行不会有太实质的作用。比如:使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是不支持的,那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError。也就是说,此属性不会帮你解决兼容性的测试问题。你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的。

 

从上面的论述可知,targetSdkVersion这个属性是在程序运行时期起作用的,系统根据这个属性决定要不要以兼容模式运行这个程序。

 

5. target

 

Android工程中还有个target属性,这个属性位于Android工程根目录下project.properties中,从名字来看很容易将其功能和targetSdkVersion混淆。

 

                                        

               

其实他们的功能大相径庭:

 

 

 

  •   targetSdkVersion这个上面已经做过分析,在程序运行时起作用,系统根据这个属性决定要不要以兼容模式运行这个程序。
  •  project.properties中的target是指在编译的时候使用哪个版本的API进行编译。它和工程下导入的api包的API Level保持一致的。如果你更改target的值,上面的api包会跟着变化,你更改api包时target的值也会变化。

 


推荐阅读
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • android ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
author-avatar
滴答滴答箫雨伞_335
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有